home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / pmode / s3unit / s3.pas < prev    next >
Pascal/Delphi Source File  |  1994-12-31  |  6KB  |  198 lines

  1.  
  2. unit S3;
  3.  
  4. {#Z+}
  5.  
  6. { S3  Version 2.00  01.01.1995  Dietmar Meschede }
  7. {                                                }
  8. { Copyright (c) 1993,1995 Dietmar Meschede       }
  9. {                                                }
  10. { Use at OWN risk!                               }
  11.  
  12. {#Z-}
  13.  
  14. { The main purpose of this unit is to set up a 320x240x256 or  }
  15. { 640x480x256 video mode with a 1 MByte linear address window. }
  16. {                                                              }
  17. { The unit requires a S3 86C928 (or better) graphic chip and   }
  18. { runs only in proteced mode.                                  }
  19.  
  20. {$DEFINE PROTECTED}
  21. {$I STDUNIT.OPT}
  22.  
  23. interface
  24.  
  25. uses
  26.   NewFrontier, VESA;
  27.  
  28. var
  29.   S3VideoLinearAddress: Longint;
  30.   S3Video, S3Video32: TSelector;
  31.  
  32. const
  33.   SETUP_OS  = $0102;
  34.   SETUP_VSE = $46E8;
  35.  
  36. procedure UnlockS3Regs;
  37. procedure LockS3Regs;
  38.  
  39. procedure S3Init320x240;
  40. procedure S3Init640x480;
  41.  
  42. procedure DoneS3;
  43.  
  44. procedure S3SetStartAddress(Start: Longint);
  45.  
  46. implementation
  47.  
  48. { Linear Address Window Control Register (CR58):      }
  49.  
  50. { Bits 1-0: LAW-SIZE - Linear Address Window Size     }
  51. {           00 = 64 KB, 01 = 1 MB, 10 = 2MB, 11 = 4MB }
  52. { Bit 4:    Enable Linear Addressing                  }
  53.  
  54. { Linear Address Window Position Registers (CR59-5A): }
  55.  
  56. { Bits 9-0: LINEAR ADDRESS-WINDOW-POSITION            }
  57. {           Linear Address Window Position bits 25-16 }
  58. {           LAW-Size = 1 MB: bits 19-16 ignored       }
  59. {           LAW-Size = 2 MB: bits 20-16 ignored       }
  60. {           LAW-Size = 4 MB: bits 21-16 ignored       }
  61.  
  62. procedure UnlockS3Regs;         { Enables access to all S3 registers }
  63. begin
  64.   WriteReg(CR, $38, $48);
  65.   WriteReg(CR, $39, $A0);
  66. end; { UnlockS3Regs }
  67.  
  68. procedure LockS3Regs;           { Disables access to extended S3 registers }
  69. begin
  70.   WriteReg(CR, $38, $00);
  71.   WriteReg(CR, $39, $00);
  72. end; { LockS3Regs }
  73.  
  74. procedure S3Init320x240;
  75. const
  76.   CrtRegs: array[0..$18] of Byte =
  77.              ($5F, $4F, $50, $82, $54, $80, $0D, $3E,
  78.               $00, $41, $00, $00, $00, $00, $00, $00,
  79.               $EA, $2C, $DF, $40, $40, $E7, $06, $A3, $FF);
  80. var
  81.   i: Byte;
  82. begin
  83.   SetVideoMode($13);                            { Init VGA Mode 13h }
  84.  
  85.   WriteReg(SR, $01, ReadReg(SR, $01) or $20);   { Turn screen off }
  86.  
  87.   Port[MISC_WT] := $E7;                         { Init Tweak Mode 320x240     }
  88.   WriteReg(CR, $11, ReadReg(CR, $11) and $7F);  { with logical line width 512 }
  89.   for i := $00 to $18 do
  90.     WriteReg(CR, i, CrtRegs[i]);
  91.   WriteReg(CR, $11, ReadReg(CR, $11) or $80);
  92.  
  93.   UnlockS3Regs;
  94.  
  95.   WriteReg(CR, $31, $8D);       { Force Enhanced Mode Mappings  }
  96.  
  97.   WriteReg(CR, $54, $01);       { Read Ahead Extra Prefetch = 1 }
  98.  
  99.   WriteReg(CR, $58, $00);       { Disable Linear Addressing (!) and other }
  100.  
  101.   WriteReg(CR, $59, $03);       { Linear Address Window Position = 3000000h }
  102.   WriteReg(CR, $5A, $00);
  103.  
  104.   WriteReg(CR, $58, $1D);       { Enable Read Ahead Cache & Linear Addressing }
  105.                                 { Linear Address Window Size = 1 MByte        }
  106.  
  107.   LockS3Regs;
  108.  
  109.   FillChar32(Ptr48(S3Video, 0), $10000, 0);     { Clear S3Video memory !!! }
  110.  
  111.   WriteReg(SR, $01, ReadReg(SR, $01) and $DF);  { Turn screen on }
  112. end; { S3Init320x240 }
  113.  
  114. procedure S3Init640x480;
  115. begin
  116.   WriteReg(SR, $01, ReadReg(SR, $01) or $20);   { Turn screen off }
  117.  
  118.   UnlockS3Regs;
  119.   WriteReg(CR, $58, $00);       { Disable Read Ahead Cache & Linear Addressing }
  120.   WriteReg(CR, $59, $00);       { Linear Address Window Position = 00A0000h }
  121.   WriteReg(CR, $5A, $0A);
  122.   LockS3Regs;
  123.  
  124.   SetSuperVGAVideoMode($101);                   { Init VESA Mode 101h }
  125.  
  126.   WriteReg(SR, $01, ReadReg(SR, $01) or $20);   { Turn screen off }
  127.  
  128.   WriteReg(CR, $13, $80);                       { Logical line width 1024 }
  129.  
  130.   UnlockS3Regs;
  131.  
  132.   WriteReg(CR, $40, ReadReg(CR, $40) or $08);   { Enable Fast Write Buffer }
  133.  
  134.   WriteReg(CR, $58, $00);       { Disable Linear Addressing (!) and other ... }
  135.  
  136.   WriteReg(CR, $59, $03);       { Linear Address Window Position = 3000000h }
  137.   WriteReg(CR, $5A, $00);
  138.  
  139.   WriteReg(CR, $58, $1D);       { Enable Read Ahead Cache & Linear Addressing }
  140.                                 { Linear Address Window Size = 1 MByte        }
  141.  
  142.   LockS3Regs;
  143.  
  144.   FillChar32(Ptr48(S3Video, 0), $10000, 0);      { Clear S3Video memory !!! }
  145.  
  146.   WriteReg(SR, $01, ReadReg(SR, $01) and $DF);  { Turn screen on }
  147. end; { S3Init640x480 }
  148.  
  149. procedure DoneS3;
  150. begin
  151.   WriteReg(SR, $01, ReadReg(SR, $01) or $20);   { Turn screen off }
  152.  
  153.   UnlockS3Regs;
  154.   WriteReg(CR, $58, $00);       { Disable Read Ahead Cache & Linear Addressing }
  155.   WriteReg(CR, $59, $00);       { Linear Address Window Position = 00A0000h }
  156.   WriteReg(CR, $5A, $0A);
  157.   LockS3Regs;
  158.  
  159.   SetVideoMode($03);            { Init Text Mode 03h }
  160. end; { DoneS3 }
  161.  
  162. procedure S3SetStartAddress(Start: Longint);
  163. begin
  164.   Start := Start shr 2;
  165.   UnlockS3Regs;
  166.   WriteReg(CR, $0D, $00);
  167.   WriteReg(CR, $0D, Byte(Start));
  168.   WriteReg(CR, $0C, Byte(Start shr 8));
  169.   WriteReg(CR, $31, (ReadReg(CR, $31) and $CF) or (Byte(Start shr 12) and $30));
  170.   WriteReg(CR, $51, (ReadReg(CR, $51) and $FC) or (Byte(Start shr 18) and $03));
  171.   LockS3Regs;
  172. end; { S3SetStartAddress }
  173.  
  174. var
  175.   SaveExit: Pointer;
  176.  
  177. procedure S3Exit; far;
  178. begin
  179.   ExitProc := SaveExit;
  180.   FreeDescriptor(S3Video32);
  181.   FreeDescriptor(S3Video);
  182. end; { S3Exit }
  183.  
  184. var
  185.   Rights: Word;
  186.  
  187. begin
  188.   S3Video := 0; S3Video32 := 0;
  189.   SaveExit := ExitProc;
  190.   ExitProc := @S3Exit;
  191.   S3VideoLinearAddress := PhysicalAddressMapping($3000000, $100000);
  192.   S3Video := CreateDescriptor(S3VideoLinearAddress, $100000);
  193.   Rights := GetSegmentAccessRights(S3Video);
  194.   Rights := (Rights and $FF70) or $0093;
  195.   SetSegmentAccessRights(S3Video, Rights);
  196.   S3Video32 := CreateData32Alias(S3Video);
  197. end. { unit S3 }
  198.